// pages/chat/index/index.js
const API = require("../../../common/api")
const AJAX = require("../../../common/request")
var common = require('../../../common/common');
var SocketTask = null
const maxTime = 5 * 60 * 1000 // 聊天间隔时间（5分钟），执行断开聊天
var settimeinter = null // 聊天定时器
const App = getApp()
Page({

    /**
     * 页面的初始数据
     */
    data: {
        // 连接状态 0 初始化值 1 正常，其它异常
        socketStatus: 0,
        // 重链任务
        retryTask: "",
        // 重链任务是否开启
        retryEnable: true,
        heartbeatTask:"",
        heartbeatEnable: true,
        msgReadQueue:[],
        msgReadStatusTask:"",
        // socket 连接状态 0 未使用，1 使用中
        socketConnectFlag: 0,
        navHeight: 0,
        navContentHeight: 0,
        navTop: 0,
        inputBottom: 0, // input 距离底部距离
        scrollInfoView: "",
        lastChatNode: "",
        customerId: "", // 客服ID
        msgTextData: "", // 文本消息
        msgImgData: "", // 图片消息
        sendInputFocus: false, // 控制光标是否聚焦在输入框中,留待扩展
        sendMenuStatus: false, // 发送消息 更多操作 菜单区域
        connectFirstTip: "人工客服已分配完成", // 连接客服首条提示
        pingTask: "",
        pingUUID: "",
        pingBack: "",
        // socket连接状态
        socketData: {
            id: 1,
            status: false,
            closeReason: "断开原因",
            closeCode: 1000, // 断开码
        },
        msgList: [
            // 	{
            // 	msgType: 1, // 消息类型 1、文字 2、图片 3、语音 4、卡片
            // 	roleType: 3, // 角色类型 1、用户 2、客服 3、智能文本
            // 	content: "欢迎进入智能客服！",
            // 	headImg: "../../../assets/img/sysUser.png"
            // }, {
            // 	msgType: 4, // 消息类型 1、文字 2、图片 3、语音 4、卡片
            // 	roleType: 3, // 角色类型 1、用户 2、客服 3、智能文本
            // 	content: "",
            // 	problemList: [{
            // 		id: "111",
            // 		text: "皮肤病都有哪几种",
            // 	}, {
            // 		id: "111",
            // 		text: "皮肤病都有哪几种",
            // 	}, {
            // 		id: "111",
            // 		text: "皮肤病都有哪几种",
            // 	}],
            // 	headImg: "../../../assets/img/sysUser.png"
            // }, {
            // 	msgType: 1, // 消息类型 1、文字 2、图片 3、语音 4、卡片
            // 	roleType: 3, // 角色类型 1、用户 2、客服 3、智能文本
            // 	content: "请仔细阅读这段话，接下来这一段话主要为了测试在多行文本情况下的样式是否错乱，阅读后你会觉得这段话基本没啥用。",
            // 	headImg: "../../../assets/img/sysUser.png"
            // }, {
            // 	msgType: 1, // 消息类型 1、文字 2、图片 3、语音
            // 	roleType: 1, // 角色类型 1、用户 2、客服 3、智能文本
            // 	content: "这是一句用户提问的话术",
            // 	headImg: "https://img0.baidu.com/it/u=489552572,2707768722&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500"
            // }, {
            // 	msgType: 1, // 消息类型 1、文字 2、图片 3、语音
            // 	roleType: 1, // 角色类型 1、用户 2、客服 3、智能文本
            // 	content: "如果你足够的有耐心，那么接下来你将会阅读到这段至关重要的信息，这段信息主要描述内容如上，over。",
            // 	headImg: "https://img0.baidu.com/it/u=489552572,2707768722&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500"
            // }, {
            // 	msgType: 1, // 消息类型 1、文字 2、图片 3、语音
            // 	roleType: 2, // 角色类型 1、用户 2、客服 3、智能文本
            // 	content: "你好客服编号0001，请问有什么问题嘛1？",
            // 	headImg: "../../../assets/img/user.png"
            // }, {
            // 	msgType: 1, // 消息类型 1、文字 2、图片 3、语音
            // 	roleType: 2, // 角色类型 1、用户 2、客服 3、智能文本
            // 	content: "你好客服编号0001，请问有什么问题嘛2？",
            // 	headImg: "../../../assets/img/user.png"
            // }, {
            // 	msgType: 1, // 消息类型 1、文字 2、图片 3、语音
            // 	roleType: 2, // 角色类型 1、用户 2、客服 3、智能文本
            // 	content: "你好客服编号0001，请问有什么问题嘛3？",
            // 	headImg: "../../../assets/img/user.png"
            // }, {
            // 	msgType: 1, // 消息类型 1、文字 2、图片 3、语音
            // 	roleType: 999, // 角色类型 1、用户 2、客服 3、智能文本 999、动作提示
            // 	content: "正在连接人工客服...."
            // }
        ],
        // 问诊单
        consultationForm: {
            username: "",
            age: "",
            phone: "",
            sexListIdx: 0,
            sexList: [{
                code: 0,
                value: "男"
            }, {
                code: 1,
                value: "女"
            }, {
                code: 2,
                value: "未知"
            }],
            // 是否检查过病因; 0否 1是
            checkHisIdx: 0,
            checkHisList: [{
                code: 0,
                value: "否"
            }, {
                code: 1,
                value: "是"
            }],
            disSite: "", // 发病部位
            disDate: "", // 发病时间
            disLike: "", // 发病症状
            drugHis: "", // 曾经用药治疗史
            liveEnv: "", // 生活工作环境
            photoList: [
                // "http://10.0.0.38:8080/profile/2024/01/05/0ZZDWLsLkStbac1928b90db0f2ec7f821cbc46f6e162_20240105174605A004.jpeg",
                // "http://10.0.0.38:8080/profile/2024/01/05/0ZZDWLsLkStbac1928b90db0f2ec7f821cbc46f6e162_20240105174605A004.jpeg"
            ]
        },
    },
    onUnload() {
        this.cleanForPage();
    },
    onLoad() {
        console.log("SocketTask -- : ", SocketTask)
        // 设置日期默认值
        this.data.consultationForm.disDate = common.formatTime(new Date(), "YYYY-MM-DD")
        this.setData({
            navHeight: App.globalData.navHeight,
            navContentHeight: App.globalData.navContentHeight,
            navTop: App.globalData.navTop,
            consultationForm: this.data.consultationForm,
        })
        this.data.retryEnable = true
        this.initMsgLoad()
        // 链接人工客服
        this.connectCustomService()
        // 打开问诊单
        this.openConsultationForm()
        // 消息状态处理任务
        this.startMsgReadStatusTask()
        // this.getList("init")
        this.getChatHisList({uid: wx.getStorageSync('wxUserId')});
    },
    cancelMsgReadStatusTask(){
        if(this.data.msgReadStatusTask!==""){
            clearInterval(this.data.msgReadStatusTask);
            this.data.msgReadStatusTask = "";
        }
    },
    startMsgReadStatusTask(){
        if(this.data.msgReadStatusTask===""){
            this.data.msgReadStatusTask = setInterval(()=>{
                if(this.data.msgReadQueue != null && this.data.msgReadQueue.length > 0){
                    let logId = this.data.msgReadQueue.shift();
                    AJAX.POST("/wsapi/msgRead", {
                        msgId:logId,
                        skipInterceptors:true,
                        loading:false
                    }).then(res=>{
                        if(res.code!==200){
                            console.error("message read error : ", logId)
                        }
                    }).catch(res=>{
                        console.error("message read catch 1 : ", logId)
                    })
                    return
                }
                console.log("msgReadStatusTask run ... empty.")
            },2000)
        }
    },
    WSReceiveMsg(data){
        console.log("afterWSReceiveMsg .... ",data);
        if(data===null || data===undefined || data ===""
            || data.logId === null || data.logId === undefined || data.logId===""){
            //console.log("data not has logId . ")
            return
        }
        let msgStatus = data.msgStatus
        if(msgStatus === "0"){
            this.data.msgReadQueue.push(data.logId)
        }
    },
    // 页面进入初始化
    initMsgLoad() {
        this.data.msgList.push({
            msgType: "1", // 消息类型 1、文字 2、图片 3、语音 4、卡片
            roleType: "3", // 角色类型 1、用户 2、客服 3、智能文本 4、系统
            content: "您好，有什么可以帮您解答的吗？",
            headImg: "../../../assets/img/sysUser.png"
        })
        this.data.msgList.push({
            msgType: "1", // 消息类型 1、文字 2、图片 3、语音 4、卡片
            roleType: "3", // 角色类型 1、用户 2、客服 3、智能文本 4、系统
            content: "您好，这里是修正唯达宁线上问诊咨询平台，可以留下您咨询的问题和患病图片，稍后会有专业客服人员联系您。",
            headImg: "../../../assets/img/sysUser.png"
        })
        this.setData({
            msgList: [...this.data.msgList], // 更新消息列表
            // 重置消息字段
            msgTextData: "",
            msgImgData: "",
            sendMenuStatus: false,
        })
    },

    // 接收拍照组件返回值
    receivePhotoList(e) {
        console.log("接收拍照组件返回值", e)
        this.data.consultationForm = e.detail
        this.setData({
            consultationForm: this.data.consultationForm
        })
    },
    // 前往聊天记录
    goChatHisPage() {
        wx.navigateTo({
            url: '/pages/chat/history/index',
        })
    },
    // 性别选择框
    bindSexPickerChange(e) {
        this.data.consultationForm.sexListIdx = e.detail.value
        this.setData({
            consultationForm: {
                ...this.data.consultationForm
            }
        })
    },
    // 日期选择
    bindDisDatePickerChange(e) {
        this.data.consultationForm.disDate = e.detail.value
        this.setData({
            consultationForm: {
                ...this.data.consultationForm
            }
        })
    },
    // 检查历史病因选择
    bindCheckHisPickerChange(e) {
        this.data.consultationForm.checkHisIdx = e.detail.value
        this.setData({
            consultationForm: {
                ...this.data.consultationForm
            }
        })
    },
    // 新增问诊单
    addConsultationForm() {
        let params = {
            wechatUsersId: wx.getStorageSync('wxUserId'),
            consultationName: this.data.consultationForm.username,
            consultationSex: this.data.consultationForm.sexListIdx,
            consultationAge: this.data.consultationForm.age,
            consultationPhone: this.data.consultationForm.phone,

            checkHis: this.data.consultationForm.checkHisIdx,
            disSite: this.data.consultationForm.disSite, // 发病部位
            disDate: this.data.consultationForm.disDate, // 发病时间
            disLike: this.data.consultationForm.disLike, // 发病症状
            drugHis: this.data.consultationForm.drugHis, // 曾经用药治疗史
            liveEnv: this.data.consultationForm.liveEnv, // 生活工作环境

            files: this.data.consultationForm.photoList,
        }
        AJAX.POST("/system/AppWechat/addbConsultation", params).then(res => {
            wx.showToast({
                title: '问诊资料填写完成',
                icon: "none"
            })
            this.closeConsultationForm()
        }).catch(err => {
            console.log(err)
            wx.showToast({
                title: '问诊资料保存失败',
                icon: "none"
            })
        })
    },
    // 重置问诊单
    resetConsultationForm() {
        // 重置表单
        this.setData({
            consultationForm: {
                username: "",
                age: "",
                phone: "",
                sexListIdx: 0,
                sexList: [{
                    code: 0,
                    value: "男"
                }, {
                    code: 1,
                    value: "女"
                }, {
                    code: 2,
                    value: "未知"
                }],

                // 是否检查过病因; 0否 1是
                checkHisIdx: 0,
                checkHisList: [{
                    code: 0,
                    value: "否"
                }, {
                    code: 1,
                    value: "是"
                }],
                disSite: "", // 发病部位
                disDate: common.formatTime(new Date(), "YYYY-MM-DD"), // 发病时间
                disLike: "", // 发病症状
                drugHis: "", // 曾经用药治疗史
                liveEnv: "", // 生活工作环境
            }
        })
    },
    // 关闭问诊单
    closeConsultationForm() {
        this.resetConsultationForm()
        // 关闭弹出框
        this.selectComponent("#leePopup").close()
    },
    // 打开问诊单
    openConsultationForm() {
        // 获取表单详情
        AJAX.POST("/system/AppWechat/getbConsultationlist", {
            wechatUsersId: wx.getStorageSync('wxUserId')
        }).then(res => {
            if (res.rows.length > 0) {
                wx.showModal({
                    title: '提示',
                    content: '检测您曾填写过，是否使用上次填写信息，快速填写',
                    success: (resModal) => {
                        if (resModal.confirm) {
                            let result = res.rows[0]
                            // 数据赋值
                            this.data.consultationForm.username = result.consultationName
                            this.data.consultationForm.age = result.consultationAge
                            this.data.consultationForm.phone = result.consultationPhone
                            this.data.consultationForm.sexListIdx = result.consultationSex

                            this.data.consultationForm.checkHisIdx = result.checkHis.toString()
                            this.data.consultationForm.disSite = result.disSite // 发病部位
                            this.data.consultationForm.disDate = result.disDate // 发病时间
                            this.data.consultationForm.disLike = result.disLike // 发病症状
                            this.data.consultationForm.drugHis = result.drugHis // 曾经用药治疗史
                            this.data.consultationForm.liveEnv = result.liveEnv // 生活工作环境
                            let arr = result.childen.map(item => {
                                return item.url
                            })
                            this.data.consultationForm.photoList = arr || []
                            this.setData({
                                consultationForm: this.data.consultationForm
                            })
                            console.log(this.data.consultationForm)
                            // 打开弹出框 leePopupStatus
                            this.selectComponent("#leePopup").open()
                        } else if (resModal.cancel) {
                            this.resetConsultationForm()
                            this.selectComponent("#leePopup").open()
                        }
                    }
                })
            } else {
                this.resetConsultationForm()
                this.selectComponent("#leePopup").open()
            }
        }).catch(err => {
            wx.showToast({
                title: '问诊单获取失败',
                icon: "none"
            })
            this.selectComponent("#leePopup").open()
        })
    },
    // 全屏预览图片
    previewScreen(e) {
        console.log(e)
        return
        let viewUrl = e.currentTarget.dataset.imgurl
        wx.previewImage({
            urls: [viewUrl]
        })
    },
    // 打开拍照
    openImage(e) {
        let photoMode = e.currentTarget.dataset.imgmode
        console.log(e, photoMode)
        wx.chooseImage({
            count: 1,
            sizeType: ['compressed'],
            sourceType: [photoMode == 1 ? 'album' : 'camera'],
            success: resChoose => {
                // tempFilePath可以作为img标签的src属性显示图片
                const tempFilePath = resChoose.tempFilePaths[0]
                console.log(tempFilePath)
                // 执行图片上传
                AJAX.UPLOADFILE("/system/AppWechat/addfile", tempFilePath, {}).then(resUpload => {
                    // 图片地址赋值回显
                    let result = JSON.parse(resUpload.data)
                    let imgUrl = API.UPLOADURL + result.msg
                    console.log("图片地址赋值回显++", this.data.msgImgData, "++", imgUrl)
                    this.data.msgImgData = imgUrl
                    this.sendSocketMsg(false, "2")
                }).catch(err => {
                    console.error(err)
                    wx.showToast({
                        title: "图片发送失败",
                        icon: "none"
                    })
                })
            }
        })
    },

    // 获取智能文本
    getList(e_idx) {
        // 获取智能文本，每次都是随机的
        AJAX.GET("/smartchat/getSmartText", {
            openId: wx.getStorageSync('wxLoginOpenid')
        }).then(res => {
            let resData = {
                msgType: "4", // 消息类型 1、文字 2、图片 3、语音 4、卡片
                roleType: "3", // 角色类型 1、用户 2、客服 3、智能文本 4、系统
                content: "",
                problemList: res.data
            }
            // 执行文本列表刷新操作
            if (typeof e_idx == "number") {
                this.data.msgList[e_idx].problemList = res.data
            } else {
                this.data.msgList.push(resData)
            }
            this.setData({
                msgList: [...this.data.msgList]
            })
            e_idx === "init" ? "" : this.scrollToBottom()
        })
    },

    // 使用人工客服
    connectCustomService() {
        if (this.data.socketConnectFlag === 1) {
            console.log("socket connection .... skip . ")
            return;
        }
        console.log("do socket connection .... ")
        this.data.socketConnectFlag = 1
        let socketUrl = API.SOCKETURL + "/" + wx.getStorageSync('wxUserId') + "/1"
        console.error("使用人工客服", socketUrl)
        this.data.msgList.push({
            msgType: "1", // 消息类型 1、文字 2、图片 3、语音
            roleType: "999", // 角色类型 1、用户 2、客服 3、智能文本 999、动作提示
            content: "正在连接人工客服...."
        })
        this.setData({
            msgList: [...this.data.msgList]
        })

        // 校验是否已连接
        if (SocketTask != null && this.data.socketData.status) {
            // 删除提示消息
            this.data.msgList.pop()
            this.setData({
                msgList: this.data.msgList,
            })
            return wx.showToast({
                title: '当前已处于会话状态，请勿重复连接',
                icon: "none"
            })
        }
        let this_ = this;
        SocketTask = wx.connectSocket({
            url: socketUrl,
            timeout: 3000,
            header: {
                'content-type': 'application/json'
            },
            success: res => {
                console.log("connectSocket-res", res)
            },
            fail: err => {
                console.error("connectSocket-err", err)
            },
            complete: com => {
                console.log("do socket connection .... complete")
            }
        })


        SocketTask.onOpen(res => {
            // 更新socket数据
            this.updateSocketData(true, "链接已打开，首次连接", 200)
            // 删除提示消息
            this.data.msgList.pop()
            this.setData({
                msgList: this.data.msgList,
            })
            console.log("-- onopen : ", SocketTask)
            // console.log("-- onopen : ", SocketTask)
            // SocketTask.send({
            //     data: JSON.stringify({
            //         "to": "", // 发送的客服唯一标识
            //         "from": wx.getStorageSync('wxUserId'), // 用户唯一标识
            //         "text": "人工客服", // 具体消息
            //         "type": "1", // socket消息类型 0、心跳 1、微信发起 2、pc发起
            //     }),
            //     success: res => {
            //         console.log("sendMsg 发送成功", res)
            //         // 超时断开
            //         // this.startSocketInterVal()
            //     }
            // })
            this.setData({
                socketStatus: SocketTask["readyState"],
            }, this.retrySocketCheck)
        })
        SocketTask.onMessage(res => {
            console.log("onMessage", res)
            // 接收socket推回数据
            // 数据梳理
            let msgSocket = JSON.parse(res.data)

            this.receiveSocketMsg(msgSocket)
            this.setData({
                socketStatus: SocketTask["readyState"],
            }, this.retrySocketCheck)
        })
        SocketTask.onError(res => {
            console.log("socket错误", res)
            // 更新socket数据
            this.updateSocketData(false, "链接错误", 500)
            this.setData({
                socketStatus: SocketTask["readyState"],
            })
        }, this.retrySocketCheck)

        SocketTask.onClose(res => {
            console.log("socket关闭", res)
            this.updateSocketData(false, res.reason, res.code)
            this.setData({
                socketStatus: SocketTask["readyState"],
            }, this.retrySocketCheck)
        })
    },
    startHeartbeatTask(){
        if(this.data.heartbeatEnable && this.data.heartbeatTask === ""){
            this.data.heartbeatTask = setInterval(()=>{
                this.sendPingMsg();
                console.log("send ping ... ")
            }, 30 * 1000)
        }
    },
    cancelHartbeatTask(){
        if(this.data.heartbeatTask !== ""){
            clearInterval(this.data.heartbeatTask);
            this.data.heartbeatTask ="";
        }
    },
    retrySocketCheck() {
        // 重试启用
        if (this.data.retryEnable && this.data.socketStatus !== 1) {
            let this_ = this;
            if (this.data.retryTask === "") {
                this.data.retryTask = setInterval(function () {
                    if (this_.data.socketStatus === 1) {
                        clearInterval(this_.data.retryTask);
                        this_.data.retryTask = "";
                        console.log("stop retry a... ")
                    }
                    console.log("retry ... ")
                    this_.connectCustomService();
                }, 5 * 1000)
                // 取消息心跳
                this.cancelHartbeatTask()
            }
        }
        // 重试停止
        if ((this.data.socketStatus === 1 || this.data.socketStatus === 0) && this.data.retryTask !== "") {
            console.log("stop retry b ... ")
            clearInterval(this.data.retryTask);
            this.data.retryTask = "";
        }
        // 启动心跳
        this.startHeartbeatTask()
        this.data.socketConnectFlag = 0
    },
    /**
     * SocketTaskClose
     * 断开socket连接
     * @param {*} reason 断开理由
     * @param {*} code 断开原因状态码
     */
    SocketTaskClose(reason, code,fn,fdParams) {
        SocketTask.close({
            code: code, // 默认1000 为用户正常关闭 3001 为超时自动断开
            reason: reason,
            complete: com => {
                console.log(SocketTask, reason, com)
            }
        })
    },
    // 发送消息
    sendSmartMsg(obj) {
        this.data.msgList.push(obj)
        this.setData({
            msgList: [...this.data.msgList], // 更新消息列表
            // 重置消息字段
            msgTextData: "",
            msgImgData: "",
            // sendInputFocus: true,
            sendMenuStatus: false,
        })
        this.scrollToBottom()
    },
    // 接收消息
    receiveSocketMsg(socketData, isInit) {

        // 对接收到的特殊字符(html标签：<br />)进行处理
        if (socketData.message) {
            socketData.message = socketData.message.replace(/<br \/>/g, "\n")
        }

        switch (socketData.code) {
            case "-1":
                if (!socketData.message || socketData.message.length <= 0) {
                    break;
                }
                this.data.msgList.push({
                    msgType: socketData.msgType || "1", // 消息类型 1、文字 2、图片 3、语音
                    roleType: "2", // 角色类型 1、用户 2、客服 3、智能文本 999、动作提示
                    content: socketData.message
                })
                this.scrollToBottom()
                break;

            case "1": // 分配客服=记录客服ID
                this.data.msgList.push({
                    msgType: "1", // 消息类型 1、文字 2、图片 3、语音
                    roleType: "2", // 角色类型 1、用户 2、客服 3、智能文本 999、动作提示
                    content: socketData.message ? socketData.message : this.data.connectFirstTip
                })
                this.data.customerId = socketData.customer
                this.scrollToBottom()
                break;
            case "200": // 正常消息
                if (!socketData.message || socketData.message.length <= 0) {
                    break;
                }
                let msgType = socketData.msgType || "1";
                if (msgType === "50") {
                    let cmdType = socketData.cmdType;
                    if (cmdType === "3") {
                        wx.showToast({
                            title: '会话中断，重新发起客服会话。',
                            icon: "none"
                        })
                        let this_ = this;
                        SocketTask.close({
                            complete() {
                                console.log("re connect ... ")
                                this_.connectCustomService();
                            }
                        });
                    }
                    return;
                }
                if (msgType === "90") {
                    console.log("ping message : ",socketData.message)
                    return;
                }
                if(msgType === "91"){
                    this.data.pingBack = socketData.message
                    return;
                }
                this.data.msgList.push({
                    msgType: socketData.msgType || "1", // 消息类型 1、文字 2、图片 3、语音 50: 指令
                    roleType: socketData.roleType, // 角色类型 1、用户 2、客服 3、智能文本 999、动作提示
                    content: socketData.message
                })
                if((socketData.roleType === "1" || socketData.roleType === "2")){
                    this.WSReceiveMsg(socketData)
                }
                this.scrollToBottom()
                break;
            default:
                if (!socketData.message || socketData.message.length <= 0) {
                    break;
                }
                this.data.msgList.push({
                    msgType: socketData.msgType || "1", // 消息类型 1、文字 2、图片 3、语音
                    roleType: "2", // 角色类型 1、用户 2、客服 3、智能文本 999、动作提示
                    content: socketData.message
                })
                this.scrollToBottom()
                break;
        }
        //TODO: 消息去重

        this.setData({
            msgList: [...this.data.msgList]
        })
    },
    getChatHisList(params){
        AJAX.POST("/wsapi/getHistoryMsg",params).then(res => {
            if(res.code === 200){
                let data =res.data
                if(data!==null && data!==undefined && data.length >0){
                    for(let i in data){
                        this.receiveSocketMsg(data[i],true);
                    }
                }
            }

        }).catch(err => {
            console.error("getHistoryMsg error : ",err)
        })
    },
    sendPingMsg() {
        //this.data.pingUUID = generateUUID();
        SocketTask.send({
            data: JSON.stringify({
                "to": "", // 发送的客服唯一标识
                "from": wx.getStorageSync('wxUserId'), // 用户唯一标识
                "text": "ping", // 具体消息
                "type": "1", // 消息类型:socket使用 1、微信发起  2、pc发起
                "msgType": "90", // 消息类型：pc/小程序使用 1、文字 2、图片 3、语音 4、卡片
                "roleType": "1", // 角色类型 1、用户 2、客服 3、智能文本
            }),
            success: res => {
                console.log("sendMsg 发送成功", res)
                // 超时断开scoket
                //this.startSocketInterVal()
            }
        })
    },
    // 发送socket消息
    sendSocketMsg(e, msgType) {
        console.log("正在发送消息：", this.data.msgTextData, this.data.customerId)
        let resultSend = ""
        // 发送文字消息-校验
        if (!msgType || msgType === "1") {
            resultSend = this.data.msgTextData
            if (this.data.msgTextData.length <= 0) {
                return wx.showToast({
                    title: '发送内容不能为空呦',
                    icon: "none",
                    duration: 1000
                })
            }
        }
        let from = wx.getStorageSync('wxUserId');
        let to = this.data.customerId ? this.data.customerId : "";
        if(from === ""){
            wx.showToast({
                title: '用户未登录或用户信息错误，请清除缓存后重新登录。',
                icon: "none"
            })
            return
        }
        // if(to === ""){
        //     wx.showToast({
        //         title: '未分配客服或客服暂不在线，请耐心等待。',
        //         icon: "none"
        //     })
        //     return
        // }
        let msg = {
            "to": this.data.customerId ? this.data.customerId : "", // 发送的客服唯一标识
            "from": wx.getStorageSync('wxUserId'), // 用户唯一标识
            "text": resultSend, // 具体消息
            "type": "1", // 消息类型:socket使用 1、微信发起  2、pc发起
            "msgType": msgType ? msgType : "1", // 消息类型：pc/小程序使用 1、文字 2、图片 3、语音 4、卡片
            "roleType": "1", // 角色类型 1、用户 2、客服 3、智能文本
        }
        if(msgType === "2"){
            msg.msgType = "2"
            msg.text = this.data.msgImgData;
        }

        AJAX.POST("/wsapi/sendMsg",msg).then(res=>{
            let code = res.code
            let data = res.data
            if(code === 200){
                // 发送图片消息-校验
                if (msgType === "2") {
                    resultSend = this.data.msgImgData
                }
                // 进入本地聊天记录
                this.sendSmartMsg({
                    msgType: msgType ? msgType : "1", // 消息类型 1、文字 2、图片 3、语音 4、卡片
                    roleType: "1", // 角色类型 1、用户 2、客服 3、智能文本
                    content: resultSend,
                    headImg: "../../../assets/img/sysUser.png"
                })

                // socket未连接状态发送标准字符处理
                if (!this.data.socketData.status) {
                    switch (this.data.msgTextData) {
                        case "人工客服":
                            this.getList()
                            break;
                        default:
                            console.error("未连接socket，发送消息为：" + this.data.msgTextData)
                            wx.showToast({
                                title: '会话已结束，如有问题请重新联系人工客服',
                                icon: "none"
                            })
                            this.data.msgTextData = ""
                            this.data.msgImgData = ""
                            this.getList()
                            break;
                    }
                    return
                }
                return
            }
            if(code !== 200){
                let msg = res.msg
                // 发起者断连
                if(data==="20" || data === "21"){
                    SocketTask.close({
                        code: 1000, // 默认1000 为用户正常关闭 3001 为超时自动断开
                        reason: "连接未知原因断开。",
                        complete: com => {
                            console.log(SocketTask, reason, com)
                            wx.showToast({
                                title: '会话未知原因中止。',
                                icon: "none"
                            })
                            this.setData({
                                socketStatus: SocketTask["readyState"],
                            }, this.retrySocketCheck)
                        }
                    })
                    return;
                }
                if(data==="40" || data === "41" || data ==="42"){
                    wx.showToast({
                        title: msg,
                        icon: "none"
                    })
                    return;
                }
                if (data === "60") {
                    wx.showToast({
                        title: '对方不在线或网络异常。',
                        icon: "none"
                    })
                    return;
                }
                console.log("wscheck error : ",res)
            }
        }).catch(res=>{
            console.error("-- wxUserRegisterUpdate error :",res)
            wx.showToast({
                title: '请求失败或网络异常。',
                icon: "none"
            })
            SocketTask.close({
                code: 1000, // 默认1000 为用户正常关闭 3001 为超时自动断开
                reason: "网络异常。",
                complete: com => {
                    console.log(SocketTask, reason, com)
                    this.setData({
                        socketStatus: SocketTask["readyState"],
                    }, this.retrySocketCheck)
                }
            })
        });
    },

    // 选择卡片问题
    selectMsg(e) {
        console.log("选择卡片问题", e.target.dataset.text)
        // 用户提问环节
        this.sendSmartMsg({
            msgType: "1", // 消息类型 1、文字 2、图片 3、语音 4、卡片
            roleType: "1", // 角色类型 1、用户 2、客服 3、智能文本
            content: e.target.dataset.text,
            headImg: "../../../assets/img/sysUser.png"
        })
        AJAX.GET("/smartchat/getTextInfo", {
            id: e.target.dataset.id,
            openId: wx.getStorageSync('wxLoginOpenid')
        }).then(res => {
            // res.data.memo
            // 卡片问题答案
            this.sendSmartMsg({
                msgType: "1", // 消息类型 1、文字 2、图片 3、语音 4、卡片
                roleType: "3", // 角色类型 1、用户 2、客服 3、智能文本
                content: res.data.memo,
                headImg: "../../../assets/img/sysUser.png"
            })
        })
    },
    // 刷新、换一批问题列表
    reloadProblem(e) {
        console.log("刷新、换一批问题列表", e.currentTarget.dataset.idx)
        this.getList(e.currentTarget.dataset.idx)
    },
    // 开启超时断开scoket
    startSocketInterVal() {
        clearTimeout(settimeinter)
        // socket已断开状态：清除定时器
        if (!this.data.socketData.status) {
            return
        }
        // socket已连接状态：重新启动并执行定时器
        settimeinter = setTimeout(() => {
            this.SocketTaskClose("超时自动断开socket", 3001)
        }, maxTime);
    },
    // 更新记录socket连接本身的数据变化
    updateSocketData(status, reason, code) {
        this.setData({
            // 更新socket连接的数据状态
            socketData: {
                status: status,
                closeCode: code,
                closeReason: reason,
            }
        })
        // if (!status) {
        // 	wx.showModal({
        // 		title: '提示',
        // 		content: '会话已结束',
        // 		showCancel: false,
        // 		confirmText: "好的",
        // 		success(res) {
        // 			if (res.confirm) {
        // 				console.warn(code, reason)
        // 			}
        // 		}
        // 	})
        // }
    },
    // 滚动条事件
    bindscroll(e) {
        console.log("bindscroll", e)
    },
    // 滚动至底部
    scrollToBottom() {
        // wx.pageScrollTo({
        // 	duration: 300,
        // 	selector:".lee-chat-block",
        // 	complete:com=>{
        // 		console.log("滚动至底部")
        // 	}
        // })
        let lastChatNode_id = 'lastChatNode_id_' + parseInt(Math.random() * 1000000)
        this.setData({
            scrollInfoView: ''
        })
        this.setData({
            lastChatNode: lastChatNode_id
        })
        setTimeout(() => {
            this.setData({
                scrollInfoView: lastChatNode_id
            })
        }, 50)
    },
    // 同步本页面所有input输入数据
    bindinput(e) {
        this.setData({
            [e.currentTarget.dataset.name]: e.detail.value
        })
    },
    // 光标聚集
    bindfocus(e) {
        console.log("光标聚集")
        this.setData({
            inputBottom: e.detail.height,
            sendInputFocus: true,
            sendMenuStatus: false, // 关闭发送消息菜单
        })
    },
    // 光标散开
    bindblur(e) {
        console.log("光标散开")
        this.setData({
            sendInputFocus: false, // 散开光标
            sendMenuStatus: false, // 关闭发送消息菜单
        })
    },
    // 打开操作菜单
    openChatMenu() {
        this.setData({
            sendMenuStatus: !this.data.sendMenuStatus
        })
    },
    goBack() {
        this.data.retryEnable =false;
        this.jump2FromPage();
        // wx.navigateTo({
        //     url: '/pages/index/index'
        // });
        console.log("----- : goBack")
    },
    cleanForPage(fn) {
        if (this.data.retryTask !== "") {
            clearInterval(this.data.retryTask)
            this.data.retryTask="";
        }
        this.cancelMsgReadStatusTask()
        this.cancelHartbeatTask()
        this.SocketTaskClose("用户onUnload断开链接", 1000,fn);
    },
    jump2FromPage(){
        const pages = getCurrentPages();
        let delta = 1
        console.log("jump2FromPage : " ,pages)
        if (pages[pages.length - 2].route === "pages/login/index") {
            delta = delta + 1
        }
        wx.navigateBack({
            delta: delta > 0 ? delta : 1
        })
    },

})